package com.outsourcing.bottle.util;

import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
/**
 * 实现图片的异步载入显示
 * @author 06peng
 *
 */
public class AsyncImageLoader {

	/**
	 * 软引用对象，在响应内存需要时，由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。
	 */
	private HashMap<String, SoftReference<Drawable>> imageCache;
	
	public AsyncImageLoader() {
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}
	
	public Drawable loadDrawable(final String imageUrl, final ImageView imageView, final ImageCallback imagecallback){
		if(imageCache.containsKey(imageUrl)){
			//从缓存中读取
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			Drawable drawable = softReference.get();
			if(drawable != null){
				return drawable;
			}
		}
		final Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				imagecallback.imageLoaded((Drawable)msg.obj, imageView, imageUrl);
			}
		};
		new Thread(){
			public void run() {
				Drawable drawable = loadImageFromUrl(imageUrl);
				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message message = handler.obtainMessage(0, drawable);
				handler.sendMessage(message);
			}
		}.start();
		
		return null;
	}
	
	public static Drawable loadImageFromUrl(String urlPath){
		URL url;
		InputStream is = null;
		try{
			url = new URL(urlPath);
			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
			is = conn.getInputStream();
		}catch(Exception e){
			e.printStackTrace();
		}
		Drawable drawable = Drawable.createFromStream(is, "src");
		return drawable;
	}
	
}
